package test1;

import mytask.Task;
import mythread.MyThread1;
import mythread.MyThread2;

import commonutils.CommonUtils;

/**
　* @Description: TODO
　* @param ${tags}
　* @return ${return_type}
　* @throws
　* @author Merlin
　* @date 2018/6/21 19:09
　*/

/**
 * synchronized同步语句块
 * 用关键字synchronized声明方法在某些情况下是有弊端的，比如A线程调用同步方法执行
 * 一个长时间的任务，那么B线程则必须等待比较长时间。在这样的情况下可以使用synchronized同步语句块来解决。
 * 以下实验证明synchronized关键字声明方法是有弊端的。
 */
public class Run {

	public static void main(String[] args) {
		Task task = new Task();

		MyThread1 thread1 = new MyThread1(task);
		thread1.start();

		MyThread2 thread2 = new MyThread2(task);
		thread2.start();

		try {
			Thread.sleep(10000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		long beginTime = CommonUtils.beginTime1;
		if (CommonUtils.beginTime2 < CommonUtils.beginTime1) {
			beginTime = CommonUtils.beginTime2;
		}

		long endTime = CommonUtils.endTime1;
		if (CommonUtils.endTime2 > CommonUtils.endTime1) {
			endTime = CommonUtils.endTime2;
		}

		System.out.println("耗时" + ((endTime - beginTime) / 1000));
	}

	/**
	 * 在使用synchronized 关键字声明方法public synchronized void doLongTimeTask()是从
	 * 运行的时间上来看，弊端很明显，解决这样的问题可以使用synchronized同步块。
	 * begin task
	   长时间处理任务后从远程返回的值1 threadName=Thread-0
	   长时间处理任务后从远程返回的值2 threadName=Thread-0
	   end task
	   begin task
	   长时间处理任务后从远程返回的值1 threadName=Thread-1
	   长时间处理任务后从远程返回的值2 threadName=Thread-1
	   end task
	   耗时6
	 *
	 *
	 */
}
